package main

import "fmt"

/*
如果说goroutine是Go程序并发的执行体，channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。
Go 语言中的通道（channel）是一种特殊的类型。通道像一个传送带或者队列，总是遵循先入先出（First In First Out）的规则，保证收发数据的顺序。

*/
/*
说白了！！channel类似于java的阻塞队列
*/
func main() {
	/*
		1. 声明channel(必须通过make进行)

		var ch1 chan int   // 声明一个传递整型的通道(仍然需要使用make赋值)
		var ch2 chan bool  // 声明一个传递布尔型的通道(仍然需要使用make赋值)
		var ch3 chan []int // 声明一个传递int切片的通道(仍然需要使用make赋值)

		//make声明无缓冲的通道（发送数据时必须有接收者，否则会阻塞）
		ch4 := make(chan int)
		ch5 := make(chan bool)
		//make声明有缓冲通道（发送的数据可以缓存在channel中，不会阻塞）
		ch6 := make(chan int, 1)
	*/
	ch1 := make(chan int, 1)

	/*
		2. 往通道发送数据
		如果是无缓冲通道，会阻塞，直到有接收者接收了
		如果是有缓冲通道，数据会直接存在通道中
	*/
	ch1 <- 10 // 把10发送到ch中，

	/*
		3. 从通道接收数据
		x := <- ch // 从ch中接收值并赋值给变量x
		<-ch       // 从ch中接收值，忽略结果
	*/
	x := <-ch1
	fmt.Println(x) //10

}
